home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / misc / volume20 / iozone / part01 next >
Encoding:
Text File  |  1991-05-25  |  17.3 KB  |  585 lines

  1. Newsgroups: comp.sources.misc
  2. From: Bill Norcott <norcott@databs.enet.dec.com>
  3. Subject:  v20i019:  iozone - sequential file I/O benchmark for UNIX, VMS & DOS, Part01/01
  4. Message-ID: <1991May24.212531.1174@sparky.IMD.Sterling.COM>
  5. X-Md4-Signature: 98e48bc9b64c65bf38abbed9cb6efee4
  6. Date: Fri, 24 May 1991 21:25:31 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: Bill Norcott <norcott@databs.enet.dec.com>
  10. Posting-number: Volume 20, Issue 19
  11. Archive-name: iozone/part01
  12. Supersedes: iozone: Volume 17, Issue 65
  13.  
  14. IOzone is an I/O benchmark which I have written.  It is a performance
  15. test of sequential file I/O.  IOzone calculates the speed at which 
  16. your system reads and writes files, and prints the rate in bytes per 
  17. second.  This is a portable benchmark, and has been tested on
  18. VAX/VMS, MS-DOS, AIX, SCO UNIX, SUNOS, ULTRIX, etc.  I would appreciate
  19. feedback on any changes needed to make it compile on Hewlett Packard,
  20. Apple, Interactive Unix, etc -- systems not already on my list.
  21.  
  22. Attached is IOzone V1.08.  This version includes auto test mode
  23. which performs a series of tests on file sizes from 1-16 MB and
  24. record lengths from 512 to 8192 bytes.  It is invoked by the 
  25. typing: iozone auto   from the the shell.  This version also
  26. fixes auto mode when compiled with Borland Turbo C on MS-DOS,
  27. and lets you compile IOzone on SUNOS without having to use
  28. -Dnolimits (the source code now compiles on SUNOS with the
  29. simple  cc -o iozone iozone.c).
  30.  
  31. Bill Norcott
  32.  
  33. ------------------------   CUT HERE -------------------------
  34. #! /bin/sh
  35. # This is a shell archive.  Remove anything before this line, then feed it
  36. # into a shell via "sh file" or similar.  To overwrite existing files,
  37. # type "sh file -c".
  38. # The tool that generated this appeared in the comp.sources.unix newsgroup;
  39. # send mail to comp-sources-unix@uunet.uu.net if you want that tool.
  40. # Contents:  iozone.c
  41. # Wrapped by kent@sparky on Fri May 24 15:40:33 1991
  42. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  43. echo If this archive is complete, you will see the following message:
  44. echo '          "shar: End of archive."'
  45. if test -f 'iozone.c' -a "${1}" != "-c" ; then 
  46.   echo shar: Will not clobber existing file \"'iozone.c'\"
  47. else
  48.   echo shar: Extracting \"'iozone.c'\" \(14433 characters\)
  49.   sed "s/^X//" >'iozone.c' <<'END_OF_FILE'
  50. X/*
  51. X*    "IO Zone" Benchmark Program
  52. X*
  53. X*    Author:    Bill Norcott (Bill.Norcott@nuo.mts.dec.com)
  54. X*        4 Dunlap Drive
  55. X*        Nashua, NH  03060
  56. X*
  57. X*  "Copyright 1991,   William D. Norcott
  58. X*  License to freely use and distribute this software is hereby granted 
  59. X*  by the author, subject to the condition that this copyright notice 
  60. X*  remains intact.  The author retains the exclusive right to publish 
  61. X*  derivative works based on this work, including, but not limited, 
  62. X*  to revised versions of this work"
  63. X*
  64. X* "This test writes a 4 MEGABYTE sequential file in 512 byte chunks, then
  65. X* rewinds it  and reads it back.  [The size of the file should be
  66. X* big enough to factor out the effect of any disk cache.]
  67. X*       
  68. X* The file is written (filling any cache buffers), and then read.  If the
  69. X* cache is >= 4 MB, then most if not all the reads will be satisfied from
  70. X* the cache.  However, if it is less than or equal to 2 MB, then NONE of
  71. X* the reads will be satisfied from the cache.  This is becase after the 
  72. X* file is written, a 2 MB cache will contain the upper 2 MB of the test
  73. X* file, but we will start reading from the beginning of the file (data
  74. X* which is no longer in the cache)
  75. X*
  76. X* In order for this to be a fair test, the length of the test file must
  77. X* be AT LEAST 2X the amount of disk cache memory for your system.  If
  78. X* not, you are really testing the speed at which your CPU can read blocks
  79. X* out of the cache (not a fair test)
  80. X*       
  81. X* IOZONE does NOT test the raw I/O speed of your disk or system.  It
  82. X* tests the speed of sequential I/O to actual files.  Therefore, this
  83. X* measurement factors in the efficiency of you machines file system,
  84. X* operating system, C compiler, and C runtime library.  It produces a 
  85. X* measurement which is the number of bytes per second that your system
  86. X* can read or write to a file.  
  87. X*
  88. X* For V1.06, IOZONE adds the "auto test" feature.  This is activated
  89. X* by the command:  'iozone auto' .  The auto test runs IOZONE repeatedly  
  90. X* using record sizes from 512 to 8192 bytes, and file sizes from 1 to 16
  91. X* megabytes.  It creates a table of results.
  92. X*       
  93. X* For V1.06, IOZONE lets you specify the number of file system sizes and      
  94. X* record lengths to test when using auto mode.  Define the constants
  95. X* MEGABYTES_ITER_LIMIT and RECLEN_ITER_LIMIT as seen below      
  96. X*       
  97. X* This program has been ported and tested on the following computer
  98. X* operating systems:
  99. X*
  100. X*    AIX Version 3 release 1 (compile: cc -Dunix -o iozone iozone.c)
  101. X*    MS-DOS 3.3        (Turbo C, Turbo C++, Microsoft C)
  102. X*    OSF/1
  103. X*    SCO Unix System V release 3.2 version 2
  104. X*    SUNOS 4.0.3, SUNOS 4.1.1
  105. X*    Ultrix V4.1 
  106. X*    VAX/VMS V5.4    **     
  107. X*    XENIX 3.2
  108. X*       
  109. X*   ** for VMS, define iozone as a foreign command via this DCL command:       
  110. X*
  111. X*    $IOZONE :== $SYS$DISK:[]IOZONE.EXE      
  112. X*
  113. X*    this lets you pass the command line arguments to IOZONE
  114. X*       
  115. X* Acknowledgements to the following persons for their feedback on IOzone:       
  116. X*
  117. X* Andy Puchrik, Michael D. Lawler, Krishna E. Bera, Sam Drake, John H. Hartman, 
  118. X* Ted Lyszczarz, Bill Metzenthen
  119. X*       
  120. X* --- MODIFICATION HISTORY:
  121. X*
  122. X*   3/7/91 William D. Norcott (Bill.Norcott@nuo.mts.dec.com)
  123. X*        created
  124. X*
  125. X*   3/22/91 Bill Norcott        tested on OSF/1 ... it works
  126. X*
  127. X*   3/24/91 Bill Norcott        V1.02 -- use calloc in TURBOC to
  128. X*                    fix bug with their malloc
  129. X*
  130. X*   3/25/91 Bill Norcott        V1.03 -- add ifdef for XENIX
  131. X*                    
  132. X*   3/27/91 Bill Norcott    V1.04 -- Includes for SCO UNIX
  133. X*                    
  134. X*   4/26/91 Bill Norcott    V1.05 -- support AIX and SUNos, check
  135. X*                    length of read() and write()
  136. X*   4/26/91 Bill Norcott    V1.06 -- tabulate results of a series 
  137. X*                    of tests
  138. X*   5/17/91 Bill Norcott    V1.07 -- use time() for VMS
  139. X*   5/20/91 Bill Norcott    V1.08 -- use %ld for Turbo C and
  140. X*                    use #ifdef sun to bypass
  141. X*                    inclusion of limits.h
  142. X*/
  143. X
  144. X/******************************************************************
  145. X
  146. X    INCLUDE FILES (system-dependent)
  147. X
  148. X******************************************************************/
  149. X#ifdef    __MSDOS__        /* Turbo C define this way for PCs... */
  150. X#define    MSDOS            /* Microsoft C defines this */
  151. X#endif
  152. X/* VMS and MS-DOS both have ANSI C compilers and use rand()/srand() */
  153. X#ifdef    VMS_POSIX
  154. X#undef   VMS
  155. X#define    ANSI_RANDOM    1
  156. X#endif
  157. X#ifdef    MSDOS
  158. X#define    ANSI_RANDOM    1
  159. X#endif
  160. X
  161. X/* incl definitions of O_* flags for XENIX */
  162. X#ifdef M_XENIX
  163. X#include <fcntl.h>
  164. X#endif
  165. X/* SCO Unix System V */
  166. X#ifdef M_UNIX
  167. X#include <sys/types.h>
  168. X#include <sys/fcntl.h>
  169. X#endif
  170. X
  171. X#if defined(VMS)
  172. X#define    ANSI_RANDOM    1
  173. X#include    <math.h>
  174. X#include    <unixio.h>
  175. X#include    <ssdef.h>
  176. X#include    <file.h>
  177. X#include    <time.h>
  178. X
  179. X#elif defined(MSDOS)
  180. X#include <fcntl.h>
  181. X#include <time.h>
  182. X#elif defined(unix)
  183. X#include <sys/file.h>
  184. X#ifndef NULL
  185. X#define NULL 0
  186. X#endif
  187. X/* 
  188. Xdefine nolimits if your system has no limits.h.  Sun's don't but I
  189. Xtake care of this explicitly beginning with V1.08 of IOzone.
  190. X*/
  191. X#ifdef sun
  192. X#define nolimits
  193. X#define BSDtime
  194. X#endif
  195. X#ifndef nolimits
  196. X#include <limits.h>
  197. X#endif
  198. X#endif
  199. X/* for systems with System V-style time, define SysVtime */
  200. X#ifdef M_SYSV
  201. X#define SysVtime
  202. X#endif
  203. X
  204. X#ifdef SysVtime
  205. X#include <sys/times.h>
  206. X#include <sys/param.h>
  207. X#ifndef CLK_TCK
  208. X#define CLK_TCK HZ
  209. X#endif
  210. X#endif
  211. X/* for systems with BSD style time, define BSDtime */
  212. X#ifdef bsd4_2
  213. X#define BSDtime
  214. X#endif
  215. X#ifdef BSDtime
  216. X#include <sys/time.h>
  217. X#endif
  218. X
  219. X
  220. X/******************************************************************
  221. X
  222. X    DEFINED CONSTANTS
  223. X
  224. X******************************************************************/
  225. X#define MEGABYTES 1            /* number of megabytes in file */
  226. X#define RECLEN 512            /* number of bytes in a record */
  227. X#define FILESIZE (MEGABYTES*1024*1024)    /*size of file in bytes*/
  228. X#define NUMRECS FILESIZE/RECLEN        /* number of records */
  229. X#define MAXBUFFERSIZE 16*1024        /*maximum buffer size*/
  230. X#define MINBUFFERSIZE 128
  231. X#define TOOFAST 10
  232. X#define USAGE  "\tUsage:\tiozone [megabytes] [record_length_in_bytes] \
  233. X[[path]filename]\n\n"
  234. X#define THISVERSION "V1.08"
  235. X
  236. X/* Define only one of the following two.*/
  237. X/*#define NOTIME        define if no time function in library*/
  238. X#define TIME                /*Use time(2)function*/
  239. X#define MAXNAMESIZE 1000                /* max # of characters in filename */
  240. X#define CONTROL_STRING1 "\t%-8ld%-8ld%-20ld%-20ld\n"
  241. X#define CONTROL_STRING2 "\t%-8s%-8s%-20s%-20s\n"
  242. X/* 
  243. X    For 'auto mode', these defines determine the number of iterations
  244. X    to perform for both the file size and the record length.
  245. X    I.e., if MEGABYTES_ITER_LIMIT = 5 use 1, 2, 4, 8 & 16 megabyte files
  246. X    if RECLEN_ITER_LIMIT = 5 use 512, 1024, 2048, 4096 & 8192 byte records
  247. X*/ 
  248. X#define MEGABYTES_ITER_LIMIT 5
  249. X#define RECLEN_ITER_LIMIT 5
  250. X
  251. X/******************************************************************
  252. X
  253. X    FUNCTION DECLARATIONS
  254. X
  255. X******************************************************************/
  256. Xvoid auto_test();        /* perform automatic test series */
  257. Xstatic double time_so_far();    /* time since start of program */
  258. X/******************************************************************
  259. X
  260. X    GLOBAL VARIABLES
  261. X
  262. X******************************************************************/
  263. Xint auto_mode;
  264. X
  265. X/******************************************************************
  266. X
  267. X    MAIN -- entry point
  268. X
  269. X******************************************************************/
  270. Xmain(argc,argv) 
  271. X      int argc;
  272. X     char *argv[];
  273. X{
  274. Xint fd;
  275. Xchar filename [MAXNAMESIZE];            /* name of temporary file */
  276. Xchar *default_filename="iozone.tmp"; /*default name of temporary file*/
  277. X
  278. X#ifdef    MSDOS
  279. Xchar *buffer; 
  280. X#else
  281. Xchar buffer [MAXBUFFERSIZE];        /*a temporary data buffer*/
  282. X#endif
  283. Xint i, status;
  284. Xunsigned long megabytes = MEGABYTES, goodmegs;
  285. Xunsigned long reclen = RECLEN, goodrecl;
  286. Xunsigned long filesize = FILESIZE;
  287. Xunsigned long numrecs = NUMRECS;
  288. Xunsigned long filebytes;
  289. Xunsigned long readrate, writerate;
  290. X#ifdef TIME
  291. X double starttime1, starttime2;
  292. X double writetime, readtime;
  293. X double totaltime;
  294. X
  295. X#endif
  296. X
  297. X#ifdef MSDOS
  298. X  buffer = (char *) calloc(1, MAXBUFFERSIZE);
  299. X#endif
  300. X
  301. X  if (!auto_mode)
  302. X  {
  303. X    printf("\n\tIOZONE: Performance Test of Sequential File I/O  --  %s\n",
  304. X          THISVERSION);
  305. X    printf("\t\tBy Bill Norcott\n\n");
  306. X  }
  307. X  strcpy(filename,default_filename);
  308. X  switch (argc) {
  309. X    case 1:       /* no args, take all defaults */
  310. X      printf(USAGE);
  311. X    break;
  312. X    case 2:     /* <megabytes|filename> */
  313. X    i = atoi(argv[1]); if (i) {
  314. X      megabytes = i;
  315. X    } else {
  316. X/*
  317. X'Auto mode' will be enabled if the first command line argument is
  318. Xthe word 'auto'.  This will trigger a series of tests
  319. X*/
  320. X      if ( (strcmp(argv[1], "auto") == 0) || 
  321. X           (strcmp(argv[1], "AUTO") == 0) )
  322. X      {
  323. X        auto_mode = 1;
  324. X        auto_test();
  325. X        printf("Completed series of tests\n");
  326. X        exit(0);
  327. X      } else {
  328. X        auto_mode = 0;
  329. X      }
  330. X      strcpy(filename,argv[1]);
  331. X        }
  332. X    break;
  333. X    case 3:     /* <megabytes> <reclen|filename> */
  334. X    megabytes = atoi(argv[1]);
  335. X    if (atoi(argv[2])) {
  336. X      reclen = atoi(argv[2]);
  337. X    } else {
  338. X      strcpy(filename,argv[2]);
  339. X    }
  340. X    break;
  341. X    case 4:     /* <megabytes> <reclen> <filename> */
  342. X    megabytes = atoi(argv[1]);
  343. X    reclen = atoi(argv[2]);
  344. X    strcpy(filename,argv[3]);
  345. X    break;
  346. X    default:
  347. X      printf(USAGE);
  348. X      exit(1);
  349. X
  350. X  }
  351. X  if (!auto_mode)
  352. X  {
  353. X    printf("\tSend comments to:\tBill.Norcott@nuo.mts.dec.com\n\n");
  354. X  }
  355. X  filesize = megabytes*1024*1024;
  356. X  numrecs = filesize/reclen;
  357. X  if (reclen >  MAXBUFFERSIZE) {
  358. X    printf("Error: Maximum record length is %d bytes\n", MAXBUFFERSIZE);
  359. X        exit(1);
  360. X    }
  361. X  if (reclen < MINBUFFERSIZE) {
  362. X    printf("Error: Minimum record length is %d bytes\n", MINBUFFERSIZE);
  363. X        exit(1);
  364. X    }
  365. X  if (!auto_mode)
  366. X  {
  367. X    printf("\tIOZONE writes a %ld Megabyte sequential file consisting of\n",
  368. X    megabytes);
  369. X    printf("\t%ld records which are each %ld bytes in length.\n",
  370. X    numrecs, reclen);
  371. X    printf("\tIt then reads the file.  It prints the bytes-per-second\n");
  372. X    printf("\trate at which the computer can read and write files.\n\n");
  373. X    printf("\nWriting the %ld Megabyte file, '%s'...", megabytes, filename);
  374. X  }  
  375. X    if((fd = creat(filename, 0640))<0){
  376. X        printf("Cannot create temporary file\n");
  377. X        exit(1);
  378. X    }
  379. X#ifdef TIME
  380. X    starttime1 = time_so_far();
  381. X#endif
  382. X    for(i=0; i<numrecs; i++){
  383. X#ifndef DEBUG_ME
  384. X        if(write(fd, buffer, (unsigned) reclen) != reclen)
  385. X            {
  386. X            printf("Error writing block %d\n", i);
  387. X            exit(1);
  388. X            }
  389. X#endif
  390. X    }
  391. X
  392. X#ifdef TIME
  393. X    writetime = time_so_far() - starttime1;
  394. X    if (!auto_mode)
  395. X        {
  396. X        printf("%f seconds", writetime);
  397. X        }
  398. X#endif
  399. X    close(fd);
  400. X#if defined (VMS)
  401. X    if((fd = open(filename, O_RDONLY, 0640))<0){
  402. X        printf("Cannot open temporary file for read\n");
  403. X        exit(1);
  404. X    }
  405. X#elif defined(MSDOS)
  406. X    if((fd = open(filename, O_RDONLY, 0640))<0){
  407. X        printf("Cannot open temporary file for read\n");
  408. X        exit(1);
  409. X    }
  410. X#else
  411. X    if((fd = open(filename, O_RDONLY))<0){
  412. X        printf("Cannot open temporary file for read\n");
  413. X        exit(1);
  414. X       }
  415. X#endif
  416. X
  417. X
  418. X            /*start timing*/
  419. X#if defined(NOTIME)
  420. X    printf("start timing\n");
  421. X#endif
  422. X    if (!auto_mode)
  423. X    {
  424. X        printf("\nReading the file...");
  425. X    }
  426. X    starttime2 = time_so_far();
  427. X   for(i=0; i<numrecs; i++) {
  428. X#ifndef DEBUG_ME
  429. X    if(read(fd, buffer, (unsigned) reclen) != reclen)
  430. X    {
  431. X        printf("Error reading block %d\n", i);
  432. X        exit(1);
  433. X    }
  434. X#endif
  435. X    }
  436. X#ifdef NOTIME
  437. X    printf("stop timing\n");
  438. X#endif
  439. X#ifdef TIME
  440. X    readtime = time_so_far() - starttime2;
  441. X    if (!auto_mode)
  442. X    {
  443. X        printf("%f seconds\n", readtime);
  444. X    }
  445. X#ifdef DEBUG_ME
  446. X    readtime = 1;
  447. X    writetime = 1;
  448. X#endif
  449. X    if(readtime!=0)
  450. X    {   
  451. X        filebytes = numrecs*reclen;
  452. X        readrate = (unsigned long) ((double) filebytes / readtime);
  453. X        writerate = (unsigned long) ((double) filebytes / writetime);
  454. X        if (auto_mode)
  455. X        {
  456. X         printf(CONTROL_STRING1,
  457. X            megabytes, 
  458. X            reclen,
  459. X            writerate,
  460. X            readrate);
  461. X                    
  462. X        } else {
  463. X        printf("\nIOZONE performance measurements:\n");
  464. X        printf("\t%ld bytes/second for writing the file\n", writerate);
  465. X        printf("\t%ld bytes/second for reading the file\n", readrate);
  466. X        totaltime = readtime + writetime;
  467. X        if (totaltime < TOOFAST) 
  468. X        {
  469. X            goodmegs = (TOOFAST/totaltime)*2*megabytes;
  470. X            printf("\nThe test completed too quickly to give a good result\n");
  471. X            printf("You will get a more precise measure of this machine's\n");
  472. X            printf("performance by re-running IOZONE using the command:\n");
  473. X            printf("\n\tiozone %ld ", goodmegs);
  474. X            printf("\t(i.e., file size = %ld megabytes)\n", goodmegs);
  475. X        }
  476. X        }
  477. X    } else {
  478. X        goodrecl = reclen/2;
  479. X        printf("\nI/O error during read.  Try again with the command:\n");
  480. X        printf("\n\tiozone %ld %ld ", megabytes,  goodrecl);
  481. X        printf("\t(i.e. record size = %ld bytes)\n",  goodrecl);
  482. X    }
  483. X#endif
  484. X    close(fd);
  485. X#ifndef VMS
  486. X    unlink(filename);    /* delete the file */
  487. X                    /*stop timer*/
  488. X#endif
  489. X#ifdef    MSDOS
  490. X    free(buffer);        /* deallocate the memory */
  491. X#endif
  492. X#ifdef VMS
  493. Xreturn SS$_NORMAL;
  494. X#else
  495. Xreturn 0;
  496. X#endif
  497. X}
  498. X/******************************************************************
  499. X
  500. X    AUTO TEST -- perform series of tests and tabulate results
  501. X
  502. X******************************************************************/
  503. Xvoid auto_test()
  504. X{
  505. X    int megsi, recszi;
  506. X    char megs[10]; 
  507. X    char recsz[10];
  508. X    int i,j;
  509. X    int argc = 3;
  510. X    char *argv[3];
  511. X    
  512. X    printf(CONTROL_STRING2,
  513. X    "MB", 
  514. X    "reclen",
  515. X    "bytes/sec written",
  516. X    "bytes/sec read");
  517. X    argv[0] = "IOzone auto-test";
  518. X    argv[1] = megs;
  519. X    argv[2] = recsz;
  520. X/*
  521. XStart with file size of 1 megabyte and repeat the test MEGABYTES_ITER_LIMIT
  522. Xtimes.  Each time we run, the file size is doubled
  523. X*/
  524. X    for(i=0,megsi=1;i<MEGABYTES_ITER_LIMIT;i++,megsi*=2) 
  525. X    {
  526. X    sprintf(megs, "%d", megsi);
  527. X/*
  528. XStart with record size of 512 bytes and repeat the test RECLEN_ITER_LIMIT
  529. Xtimes.  Each time we run, the record size is doubled
  530. X*/
  531. X    for (j=0,recszi=512;j<RECLEN_ITER_LIMIT;j++,recszi*=2)
  532. X    {
  533. X        sprintf(recsz, "%d", recszi);
  534. X        main(argc, argv);
  535. X    }
  536. X    }
  537. X}
  538. X
  539. Xstatic double
  540. Xtime_so_far()
  541. X{
  542. X#if defined(VMS)
  543. X/* 
  544. X*   5/17/91 Bill Norcott    V1.07 -- use time() for VMS
  545. XThe times() function in VMS returns proc & user CPU time in 10-millisecond
  546. Xticks.  Instead, use time() which lacks the precision but gives clock
  547. Xtime in seconds.
  548. X*/
  549. X
  550. X  return (double) time(NULL);
  551. X
  552. X#elif defined(SysVtime)
  553. X  int        val;
  554. X  struct tms tms;
  555. X
  556. X  if ((val = times(&tms)) == -1)
  557. X    perror("times");
  558. X
  559. X  return ((double) val) / ((double) CLK_TCK);
  560. X#elif defined(MSDOS)
  561. X  return ((double) clock()) / ((double) CLK_TCK);
  562. X#else
  563. X  struct timeval tp;
  564. X
  565. X  if (gettimeofday(&tp, (struct timezone *) NULL) == -1)
  566. X    perror("gettimeofday");
  567. X  return ((double) (tp.tv_sec)) +
  568. X    (((double) tp.tv_usec) / 1000000.0);
  569. X#endif
  570. X}
  571. END_OF_FILE
  572.   if test 14433 -ne `wc -c <'iozone.c'`; then
  573.     echo shar: \"'iozone.c'\" unpacked with wrong size!
  574.   fi
  575.   # end of 'iozone.c'
  576. fi
  577. echo shar: End of archive.
  578. exit 0
  579. exit 0 # Just in case...
  580. -- 
  581. Kent Landfield                   INTERNET: kent@sparky.IMD.Sterling.COM
  582. Sterling Software, IMD           UUCP:     uunet!sparky!kent
  583. Phone:    (402) 291-8300         FAX:      (402) 291-4362
  584. Please send comp.sources.misc-related mail to kent@uunet.uu.net.
  585.